2017-08-24 21 views
1

との複合主キー私はJPAやHibernateのを使って春のブートアプリケーションを開発しようとしている、と私は、次の2つのテーブルを持っている:JPA/Hibernateは - 外部キー

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; 

これらの2つのテーブル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; 
} 

複合イド:私は、クエリを実行するとき は、まだ春/ Hibernateはこのエラーを返しますhttps://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencingここにすべてを読ん

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

    @NonNull 
    public String id; 
} 

Spring Repository findAll()メソッドを使用します。

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

何が問題なのですか。私は1日を失ったが、まだ私は理解していない。

そして、ここでは...

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=? 

が休止状態のように思える参加やっていません。

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

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

そして、実際のクエリ:要求ごととして

、これらは2つのリポジトリです要求に応じて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には厳密な列の置換があり、わかりにくいです。 SQLログを有効にすると、名前はフルコンテキストになります –

+1

2つのリポジトリを追加しましたが、問題はありません。 – LppEdd

答えて

0

最後に、旅は終わりに来る... See this question
エンティティの列名を変換するときのHibernateの命名方法です。使用

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

は、問題を解決しました。しかし なぜ@JoinColumn(name = "userId")が認識されないのですか?