Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jpa复合主键和具有唯一键的jointable_Jpa_Composite Primary Key_Unique Key_Jointable - Fatal编程技术网

jpa复合主键和具有唯一键的jointable

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` ( `

以下是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` (
  `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;