jpa复合主键和具有唯一键的jointable
以下是sql表:jpa复合主键和具有唯一键的jointable,jpa,composite-primary-key,unique-key,jointable,Jpa,Composite Primary Key,Unique Key,Jointable,以下是sql表: 选项主键为名称+值 CREATE TABLE `option` ( id int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `value` varchar(45) NOT NULL, PRIMARY KEY (`name`, `value`), UNIQUE KEY `id_UNIQUE` (`id`) ) 产品主键是增量id CREATE TABLE `product` ( `
选项主键为名称+值
CREATE TABLE `option` (
id int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`value` varchar(45) NOT NULL,
PRIMARY KEY (`name`, `value`),
UNIQUE KEY `id_UNIQUE` (`id`)
)
产品主键是增量idCREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
)
产品有多个选项(由唯一键“id”引用)在java方面,我以这种方式映射了“选项” 用这种方式生产
@Entity
@Table(name="product")
public class Product {
@Id @Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="name")
private String name
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(
name="product_option",
joinColumns = @JoinColumn( name="id_product"),
inverseJoinColumns = @JoinColumn( name="id_option", referencedColumnName="id")
)
private Set<Option> options;
}
但是我不知道如何根据模式来解决这个问题,您的实体注释有点不正确。在指定“产品”和“选项”时,应使用“id\u产品”和“id\u选项”:
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(
name="product_option",
joinColumns = @JoinColumn( name="id_product"),
inverseJoinColumns = @JoinColumn( name="id_option", referencedColumnName="id")
)
private Set<Option> options;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@可接合(
name=“产品选项”,
joinColumns=@JoinColumn(name=“id\u product”),
inverseJoinColumns=@JoinColumn(name=“id\u option”,referencedColumnName=“id”)
)
私人集合期权;
顺便说一句,从长远来看,如果您在选项表上切换主键和唯一键,您的生活会轻松得多。我的错误。我已经改正了错误。(我仍然有这个问题)。出于业务目的,最好有一个有意义的主键,并且仅将技术id用于数据库目的,但在数据库级别,您应该处理“技术”id。您的唯一密钥将成为您的“业务密钥”。今天晚些时候我会在工作中运行您的样本。看起来它应该按原样运行。
@Entity
@Table(name="product")
public class Product {
@Id @Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="name")
private String name
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(
name="product_option",
joinColumns = @JoinColumn( name="id_product"),
inverseJoinColumns = @JoinColumn( name="id_option", referencedColumnName="id")
)
private Set<Option> options;
}
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
at org.hibernate.sql.SelectFragment.addColumns(SelectFragment.java:107)
at org.hibernate.persister.collection.BasicCollectionPersister.manyToManySelectFragment(BasicCollectionPersister.java:308)
at org.hibernate.persister.collection.BasicCollectionPersister.selectFragment(BasicCollectionPersister.java:294)
at org.hibernate.loader.JoinWalker.selectString(JoinWalker.java:1070)
at org.hibernate.loader.AbstractEntityJoinWalker.initStatementString(AbstractEntityJoinWalker.java:124)
at org.hibernate.loader.AbstractEntityJoinWalker.initStatementString(AbstractEntityJoinWalker.java:109)
at org.hibernate.loader.AbstractEntityJoinWalker.initAll(AbstractEntityJoinWalker.java:91)
at org.hibernate.loader.AbstractEntityJoinWalker.initAll(AbstractEntityJoinWalker.java:78)
at org.hibernate.loader.entity.CascadeEntityJoinWalker.<init>(CascadeEntityJoinWalker.java:52)
at org.hibernate.loader.entity.CascadeEntityLoader.<init>(CascadeEntityLoader.java:47)
at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3254)
at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191)
at org.hibernate.persister.entity.SingleTableEntityPersister.postInstantiate(SingleTableEntityPersister.java:728)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 60 more
A Foreign key refering Option from Product has the wrong number of column. should be 2
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(
name="product_option",
joinColumns = @JoinColumn( name="id_product"),
inverseJoinColumns = @JoinColumn( name="id_option", referencedColumnName="id")
)
private Set<Option> options;