@OneToMany with @JoinTable error

寵の児 提交于 2021-01-27 04:21:33

问题


I'm trying to understand **@OneToMany** with **@JoinTable** for such scenerio

I'm using JPA 2.1, Hibernate 5.0.4 and Oracle 11 XE. When i call userDao.save(user) (code below) i've got

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (HIBERNATE.USER2ORDER_PK) violated

What am I doing wrong? Could someone help me understand?

DDL:

DROP TABLE HIBERNATE.T_USER2ORDERS;
DROP TABLE HIBERNATE.T_ORDERS;
DROP TABLE HIBERNATE.T_USERS;
DROP SEQUENCE HIBERNATE.USERS_SEQ;
DROP SEQUENCE HIBERNATE.ORDERS_SEQ;

CREATE TABLE HIBERNATE.T_USERS (
  ID                                NUMBER(15),
  NAME                              VARCHAR2(100 CHAR),
  CONSTRAINT USER_PK PRIMARY KEY (ID)
);

CREATE TABLE HIBERNATE.T_ORDERS (
  ID                                NUMBER(15),
  ORDER_DETAILS                     VARCHAR2(100 CHAR) NOT NULL,
  CONSTRAINT UDETAILS_PK PRIMARY KEY (ID)
);

CREATE TABLE HIBERNATE.T_USER2ORDERS (
  ID_USER                           NUMBER(15) NOT NULL,
  ID_ORDER                          NUMBER(15) NOT NULL,
  CONSTRAINT USER2ORDER_PK PRIMARY KEY (ID_USER),
  CONSTRAINT USER_FK FOREIGN KEY (ID_USER) REFERENCES T_USERS(ID),
  CONSTRAINT ORDER_FK FOREIGN KEY (ID_ORDER) REFERENCES T_ORDERS(ID)
);

CREATE SEQUENCE HIBERNATE.USERS_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
CREATE SEQUENCE HIBERNATE.ORDERS_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;

Dao:

@Repository
@Transactional
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    public static final Logger LOG = LoggerFactory.getLogger(UserDaoImpl.class);

    @Autowired
    public UserDaoImpl(SessionFactory sessionFactory) {
        setSessionFactory(sessionFactory);
    }

    @Override
    public Serializable save(UserModel user) {
        return getHibernateTemplate().save(user);
    }
}

UserModel:

@Entity
@Table(name = "T_USERS")
@SequenceGenerator(name = "users-sequence-generator", sequenceName = "USERS_SEQ", initialValue = 0, allocationSize = 1)
public class UserModel {

    @Id
    @Column(name = "id")
    @GeneratedValue(generator = "users-sequence-generator", strategy = GenerationType.SEQUENCE)
    private Long id;

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

    @OneToMany(
            cascade = CascadeType.ALL,
            orphanRemoval = true,
            fetch = FetchType.EAGER)
    @JoinTable(
        name="t_user2orders", 
        joinColumns = {@JoinColumn(name="id_user", referencedColumnName="id")},
        inverseJoinColumns = {@JoinColumn(name="id_order", referencedColumnName="id")}
    )
    private Collection<OrderModel> orders = new LinkedHashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Collection<OrderModel> getOrders() {
        return orders;
    }

    public void setOrders(Collection<OrderModel> orders) {
        this.orders = orders;
    }
}

OrderModel:

@Entity
@Table(name="T_ORDERS")
@SequenceGenerator(name="orders-sequence-generator", sequenceName="ORDERS_SEQ", initialValue=0, allocationSize=1)
public class OrderModel {

    @Id
    @Column(name="id")
    @GeneratedValue(generator="orders-sequence-generator", strategy=GenerationType.SEQUENCE)
    private Long id;

    @Column(name="order_details")
    private String orderDetails;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getOrderDetails() {
        return orderDetails;
    }

    public void setOrderDetails(String orderDetails) {
        this.orderDetails = orderDetails;
    }
}

回答1:


Thanks to suggestions of @tharindu_DG I have found error.

Unique constraint on T_USER2ORDERS was invalid.

Instead CONSTRAINT USER2ORDER_PK PRIMARY KEY (ID_USER) should be CONSTRAINT USER2ORDER_PK PRIMARY KEY (ID_ORDER)

Thank for help.




回答2:


The unique constraint in merging Table USERS2ORDERS should have a primary key as a combination of both fields user_id and order_id. However, it is recommended to have a primary key as record_id, you don't know when you can use it.



来源:https://stackoverflow.com/questions/34351803/onetomany-with-jointable-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!