web-dev-qa-db-ja.com

ロンボクはJPAに副作用がありますか

Jpaエンティティを変換してロンボクを使用するよう取り組んでいます。結果のコードは次のとおりです。

_@Entity
@Table(name = "TEST")
@Data
@NoArgsConstructor
@AllArgsConstructor
class Test {
   ...
   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   private FormatType formatType;
   ...
}
_

結果のエラーメッセージには以下が含まれます

_Caused by: org.hibernate.HibernateException: Missing column: formatType in TEST
_

ここで何をググるのか本当にわからない。 (formatTypeの前にすべてをgoogleに貼り付けてみました-何も表示されませんでした)

注意:

  1. 簡潔さとプライバシーを保護するために、フィールドの名前が変更され、関連がないと思われる側面が省略されています。何かがタイプミスのように見える場合、それはおそらくそうです。あなたが何かに気づいたら、私がそれに対処できるように私に知らせてください。

  2. フィールドを説明する3行は、私が使用しているコードから変更されていません

編集:

エラーメッセージの直前に気づきました

_13:22:19,967 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (ServerService Thread Pool -- 57) HHH000261: Table found: TABLE
13:22:19,967 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (ServerService Thread Pool -- 57) HHH000037: Columns: [..., formatType, ...]
13:22:19,968 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 57) MSC000001: Failed to start service jboss.persistenceunit."...": org.jboss.msc.service.StartException in service jboss.persistenceunit."...": javax.persistence.PersistenceException: [PersistenceUnit: ...] Unable to build EntityManagerFactory
_

機能するはずです

_  @Entity
  @Inheritance(strategy = InheritanceType.JOINED)
  @Table(name = "PARENT")

  public abstract class Parent implements Serializable {

     private static final long serialVersionUID = 1;
     @Id
     @Column(name = "ID")
     @GeneratedValue
     private long id;
     @Column(name = "ENABLED")
     private boolean enabled;
  }

  @Entity
  @Table(name = "CHILD")
  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  public class Child extends Parent {
     /** XXX: HERE BE DRAGONS */
     @Column(name = "ENUM_1")
     @Enumerated(EnumType.STRING)
     private Enum1 enum1;
     @Column(name = "ENUM_2")
     @Enumerated(EnumType.ORDINAL)
     private Enum2 enum2;
     /** XXX: NO MORE DRAGONS */
     @Column(name = "FREQUENCY")
     private String frequency;
     @Column(name = "EMPTY")
     private boolean empty;
     @Column(name = "MAX_SIZE")
     private int maxSize;
  }
  public enum Enum1 {
     A,
     B,
     C
  }
  public enum Enum2 {
     X,
     Y,
     Z
  }
_

ロンボクの変更をロールバックしました。問題が何であるか知りたいのですが、Rushはありません。また、この素敵な小さなバグのおかげで、私は約4時間遅れているので、応答が少し遅いかもしれません。

子テーブルのpkは親テーブルのfkであり、ChildクラスにIDがないにもかかわらず、ロンボクがないとすべてが機能しているように見えます。

解決策:

これを尋ねるのをすっかり忘れていました。少し前に私はこの問題を修正しました。ソリューションを説明するために、最初に含めた最初の例を少し簡略化したバージョンを見てみましょう。

_@Entity
@Table(name = "TEST")
@Setter
@Getter
class Test {
   ...
   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   private FormatType formatType;
   ...
}
_

ロンボクはあなたにこれを与えるようです:

_@Entity
@Table(name = "TEST")
class Test {
   ...
   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   private FormatType formatType;

   public FormatType getFormatType() {
      return formatType;
   }
   public void setFormatType(FormatType formatType) {
      this.formatType = formatType;
   }
   ...
}
_

注釈はフィールドに添付されたままであることに注意してください。現在、使用しているのがJPAのバージョンまたは実装だけかどうかはわかりませんが、アクセサが定義されている場合、jpaは_@Column_以外の注釈(および_@Column_-jpaが間違った列名を探していた理由です)。したがって、実際には次のものが必要です。

_@Entity
@Table(name = "TEST")
class Test {
   ...
   private FormatType formatType;

   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   public FormatType getFormatType() {
      return formatType;
   }
   public void setFormatType(FormatType formatType) {
      this.formatType = formatType;
   }
   ...
}
_

例を見つけ、ロンボクがどのように機能するかに関するいくつかの詳細を入力しようとする大きな混乱の後、私はこの小さな宝石を発見しました: onMethod=@__({@AnnotationsHere}) =。この機能を利用して、次のことを思いつきました。

_@Entity
@Table(name = "TEST")
@Setter
class Test {
   ...
   @Getter(onMethod=@__({
         @Column(name = "FORMATTING"),
         @Enumerated(EnumType.ORDINAL)
      }))
   private FormatType formatType;

   ...
}
_

そしてプレストはそれが機能します。これで、現時点で私たち全員が検討している質問に対処したい唯一の利用可能なソリューションがあるように見えます。手動でメソッドを記述してそこに注釈を付けるよりも本当にきれいですか?回答:...わかりません。解決策を見つけてうれしいです。

11
chrisgotter

変わっている。より多くのコードを表示できますか?私はあなたの質問のようなコードの一部で単純なプロジェクトを書こうとしています、そしてそれはうまくいきました。 Spring BootとMySQLを使用しました。設定を確認してください。私のコードがあります:

列挙:

public enum FormatType {

    FIRST_TYPE, SECOND_TYPE
}

MySQLのテーブル:

create table TEST
(
    ID int auto_increment primary key,
    FORMATTING int not null
);

エンティティ:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Table(name = "TEST")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "FORMATTING")
    @Enumerated(EnumType.ORDINAL)
    private FormatType formatType;
}

リポジトリ:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TestRepository extends JpaRepository<Test, Integer> {
}

サービス:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import Java.util.List;

@Service
public class TestService {

    private TestRepository repository;

    @Autowired
    public TestService(TestRepository repository) {
        this.repository = repository;
    }

    public List<Test> getAllTestEntities() {
        return repository.findAll();
    }
}
2

LombokとJPAでも同じ問題に直面しましたが、Lombokをセットアップしたところ、期待どおりに動作しました。以下はコードです:

コントローラ

package com.sms.controller;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.sms.model.StudentModel;
import com.sms.persistance.StudentRepository;

@RestController
public class StudentController {

    @Autowired
    private StudentRepository sr;

    @PostMapping("/addstudent")
    public String addStudent(@Valid @RequestBody StudentModel studentModel) {
        StudentModel result = sr.save(studentModel);
        return result.equals(null)?"Failed":"Successfully Saved student data";
    }

}

モデル

package com.sms.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;
import lombok.RequiredArgsConstructor;

@Data
@RequiredArgsConstructor
@Entity
@Table(name="student", schema="development")
public class StudentModel {

    @Id
    @Column(name="student_id")
    private int id;
    @Column(name="student_name")
    private String studentname;
    @Column(name="student_address")
    private String studentaddress;



}

リポジトリ

package com.sms.persistance;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.sms.model.StudentModel;

@Repository
public interface StudentRepository extends JpaRepository<StudentModel, Integer>{

}
1
shaktirath

ロンボクが実行時の問題を引き起こす可能性は低いです。プリコンパイル時に機能するため、生成されたコードを逆コンパイルすると便利な場合があります。ソースコードにロンボクアノテーションを配置する順序が最終結果に影響する場合があるので、 @Dataおよび@NoArgsConstructor、@ NoArgsConstructorを削除して、問題が解決するかどうかを確認できます。

1
leoconco