JPA,提交时不会向数据库添加任何内容

问题描述

我有两个表(command 和 commandLine),我想在插入新命令时同时写入这两个表 这是我的命令对象,我使用 OnetoMany 与对象 CommandLine 进行映射

@Entity
@Table(name = "t_commands")
public class Command {

    @Id @Getter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idCommand;

    @Getter @Setter
    @ManyToOne(targetEntity = User.class)
    @JoinColumn(name = "idUser",nullable = false)
    private User user;

    @Getter @Setter
    @Column(name = "commandDate")
    private String date;

    @Getter @Setter
    @OnetoMany(targetEntity = CommandLine.class,mappedBy = "idCommand")
    private List<CommandLine> lines = new ArrayList<>();

    public Command(User user,String date) {
        this.user = user;
        this.date = date;
    }

    public Command() {
    }

和我的 CommandLine 对象,我使用 ManyToOne 与对象 Command 进行映射

@Entity
@Table(name = "t_commandlines")
public class CommandLine {

    @Id @Getter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idCommandLine;

    @Getter
    @ManyToOne(targetEntity = Command.class,cascade = CascadeType.ALL)
    @JoinColumn(name = "idCommand",nullable = false)
    private Command idCommand;

    @Getter @Setter
    @ManyToOne(targetEntity = Article.class)
    @JoinColumn(name = "idArticle",nullable = false)
    private Article article;

    @Getter @Setter
    private int quantity;


    public CommandLine(Article article,int quantity) {
        this.article = article;
        this.quantity = quantity;
    }

和我的 CommandDAO

public class CommandDAO implements IDao<Command> {

    @Override
    public boolean create(Command object) {
        connect().persist(object);
        return true;
    }
}

我使用界面

public interface IDao<T> {

    default EntityManager connect() {
        EntityManagerFactory entityManagerFactory;
        EntityManager entityManager;

        entityManagerFactory = Persistence.createEntityManagerFactory("webstore");
        entityManager = entityManagerFactory.createEntityManager();

        return entityManager;
    }

    default T read(Long id){return null;}
    default List<T> getAll() {return null;}
    default boolean create(T object) {return false;}
    default boolean update(T object) {return false;}
    default boolean delete(T object) {return false;}
    default Long getCount() {return 1L;}
}

我没有错误,但是我的数据库中没有写入任何内容,使用这种结构从数据库中检索数据没有问题,但无法写入

解决方法

它不会应用更改,因为没有事务,因此持久操作不会刷新到数据库。

以下是代码外观的简化示例:

public class CommandDAO implements IDao<Command> {

    @Override
    public boolean create(Command object) {
        EntityManager em = connect();
        try {
          em.getTransaction().begin();
          em.persist(object);
          em.getTransaction().commit();
          return true;
        }
        finally {
          em.close();
        }
    }
}

此外,没有理由在每次调用 EntityManagerFactory 时都创建 connect()。工厂的创建相当繁重,但工厂是线程安全的,您可以在需要时重用它。 每次需要时都创建一个 EntityManager 是有意义的,但完成后必须关闭它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...