2017-08-24 141 views
1

我试图开发使用JPA和Hibernate Spring的启动应用程序,和我有以下两个表:JPA /休眠 - 与复合主键的外键

CREATE TABLE IF NOT EXISTS `library`.`User` (
    `id` VARCHAR(30) NOT NULL COMMENT 'The username', 
    `name` VARCHAR(50) NULL, 
    `surname` VARCHAR(50) NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

CREATE TABLE IF NOT EXISTS `library`.`Library` (
    `userId` VARCHAR(30) NOT NULL, 
    `id` CHAR(36) NOT NULL COMMENT 'An autogenerated UUID', 
    `name` VARCHAR(50) NULL, 
    PRIMARY KEY (`id`, `userId`), 
    INDEX `USER_idx` (`userId` ASC), 
    CONSTRAINT `USER` 
    FOREIGN KEY (`userId`) 
    REFERENCES `library`.`User` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 

这两个表是mappes如下所示: 我使用龙目岛避免无聊的东西。 用户:

@Entity 
@Table(name = "user") 
@NoArgsConstructor 
@Getter 
@Setter 
public class User 
{ 
    @Id 
    @Column(name = "id") 
    private String id; 

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

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

    @OneToMany(mappedBy = "userId") 
    private Set<Library> libraries = new HashSet<>(); 
} 

库:

@Entity 
@Table(name = "library") 
@IdClass(LibraryId.class) 
@NoArgsConstructor 
@Getter 
@Setter 
public class Library 
{ 
    @Id 
    @ManyToOne 
    @JoinColumn(name = "userId", referencedColumnName = "id") 
    private User userId; 

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

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

复合ID为图书馆:

@RequiredArgsConstructor 
@NoArgsConstructor 
@Getter 
@Setter 
@ToString 
@EqualsAndHashCode 
public class LibraryId implements Serializable 
{ 
    @NonNull 
    public String userId; 

    @NonNull 
    public String id; 
} 

我读到这里的一切https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing ,仍然执行查询时春/休眠返回此错误通过Spring Repository findAll()方法。

SQL Error: 1054, SQLState: 42S22 
Unknown column 'libraries0_.user_id' in 'field list' 

怎么了?我失去了一天,但仍然不理解。

根据要求,这是两个库:

@Repository 
public interface UserRepository extends JpaRepository<User, String> 
{ 
    // 
} 

@Repository 
public interface LibraryRepository extends JpaRepository<Library, LibraryId> 
{ 
    // 
} 

和实际查询:

select user0_.id as id1_1_, user0_.name as name2_1_, user0_.surname as surname3_1_ from user user0_ 

select libraries0_.user_id as user_id2_0_0_, libraries0_.id as id1_0_0_, libraries0_.id as id1_0_1_, libraries0_.user_id as user_id2_0_1_, libraries0_.name as name3_0_1_ from library libraries0_ where libraries0_.user_id=? 

看起来像Hibernate是不是做一个加入...

这里是Maven POM,根据要求:

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.6.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <optional>true</optional> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 
+1

请显示您正在使用的查询或JPA存储库类。 –

+0

hibernate具有specyfic列替换,很难理解。打开SQL logginng,名称将在完整上下文中 –

+1

添加了两个存储库,但它们不是问题。 – LppEdd

回答

0

Ahhh终于旅程结束了...... See this question
问题是转换实体列名时的Hibernate命名策略。

使用:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

解决了这个问题。但是 我不明白为什么@JoinColumn(name = "userId")不被识别!