一对一的休眠关系中的外键

问题描述 投票:0回答:2

我在以下两个实体之间具有一对一的关系:

@Entity
@Table(name = "user")
public class User {

    @Id
    @Column(name="id")
    private String id;

    @Column
    private String name;

    @Column
    private String email;

    @Column
    private String password;

    @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
    @JoinColumn(name = "user_role_id", referencedColumnName = "id")
    private UserRole userRole;
@Entity
@Table(name = "userRole")
public class UserRole {

    @Id
    @Column(name="id")
    private String id;

    @Column
    private String description;

    @OneToOne(mappedBy = "userRole")
    private User user;

    public UserRole() {
    }

我还使用EntityManagerFactory在本地数据库中创建表。我收到了此代码,必须遵循。

public class UserRepo {

    private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ro.tutorial.lab.SD");

    public void insertNewUser(User user) {
        EntityManager em = entityManagerFactory.createEntityManager();
        em.getTransaction().begin();
        em.persist(user);
        em.getTransaction().commit();
        em.close();
    }

也有类似的UserRoleRepo。

我的问题是在main中实例化时,我不知道如何仅获取User中FK的UserRole ID。相反,我得到了userRole的整个实例和错误“键“ userrole.PRIMARY”的重复条目'b36fcb4c-3904-4205-888b-9792f24d8b5c'“。

public static void main(String[] args) {
        UserRoleRepo userRoleRepo= new UserRoleRepo();

        UserRole userRole1 = new UserRole();
        userRole1.setId(UUID.randomUUID().toString());
        System.out.println(userRole1);
        userRole1.setDescription("admin");
        userRoleRepo.insertNewUser(userRole1);

        UserRole userRole2 = new UserRole();
        userRole2.setId(UUID.randomUUID().toString());
        System.out.println(userRole2);
        userRole2.setDescription("client");
        userRoleRepo.insertNewUser(userRole2);

        UserRepo userRepo= new UserRepo();

        User user = new User();
        user.setId(UUID.randomUUID().toString());
        user.setName("Todoran");
        user.setEmail("[email protected]");
        user.setPassword("mona");
        user.setUserRole(userRole1); //////////it breaks here :(((((
        System.out.println(user);
        userRepo.insertNewUser(user);

    }
java hibernate foreign-keys persistence.xml hibernate-entitymanager
2个回答
0
投票

错误消息很清楚,您违反了主键约束(唯一性)。这是因为UUID.randomUUID()确实会生成随机ID,但是它不知道数据库中已经存在什么内容,因此会产生冲突。考虑使用序列或身份。


0
投票

似乎让我感到困惑,并且UserRole和User表之间的正确关系是一对多的。现在可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.