当表没有主键时,@ Entity中的@Id仅在一个事务中起作用,而不在多个事务中起作用?

时间:2018-06-21 19:43:00

标签: hibernate jpa

我想知道,要使@Id批注起作用,数据库中的表是否需要具有主键。 (对于@ManyToOne注释和外键也一样,但是我还没有研究这种情况。)

数据库中有一个表foo,该表没有主键,只有2列,idname

在Java中,一个@Entity Foo具有2个属性:@Id idString name

在persistence.xml中,hibernate.hbm2ddl.auto不是create;桌子已经在那里了。

当我在同一事务中使用相同的Foo保存2个id时,Hiberate抗议:javax.persistence.EntityExistsException:具有相同标识符值的另一个对象已与该会话关联。

Hibernate接管数据库中的主键是真的吗?  (除了索引)?

但是当我将2个Foo分别保存在2个事务中时,它们将保存到数据库中,因此Hiberate的@Id不能用作主键!

是否故意@Id仅在同一笔交易中起作用?

Java中的实体和事务为:

@Entity
public class Foo {

    @Id
    private Long id;

    private String name;

    // <init>s and getters and setters


public class EntityTests

    private String name;
    @Test
    public void test2() throws Exception {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();

        Foo foo=new Foo(1l,"bar");
        entityManager.persist(foo);

        entityManager.getTransaction().commit();
        entityManager.close();

        entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();

        Foo foo2=new Foo(1l,"baz");
        entityManager.persist(foo2);

        entityManager.getTransaction().commit();
        entityManager.close();
    }

在数据库中,我们看到:

sql> select*from foo;
ID | NAME
1  | bar
1  | baz

1 个答案:

答案 0 :(得分:0)

如果您在休眠状态下阅读了有关标识符的文档,它说它们假定相应的db列是唯一的,不是null和不可变的,因此,当您已经有数据库表时,则需要确保表格中相应的标识符列符合这些要求

Hibernate doc