微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – @OneToMany @JoinTable错误

我试图用** @ JoinTable **来理解** @ OnetoMany **这样的场景

我正在使用JPA 2.1,Hibernate 5.0.4和Oracle 11 XE.当我调用userDao.save(用户)(下面的代码)时,我已经得到了

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

我究竟做错了什么?有人可以帮我理解吗?

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;

道:

@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;
    }
}

解决方法

感谢@tharindu_DG的建议,我发现了错误.

T_USER2ORDERS的唯一约束无效.

而CONSTRAINT USER2ORDER_PK PRIMARY KEY(ID_USER)应该是CONSTRAINT USER2ORDER_PK PRIMARY KEY(ID_ORDER)

谢谢你的帮助.

原文地址:https://www.jb51.cc/java/129214.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐