Kolejność w kluczu złożonym JPA

Kolejność w kluczu złożonym JPA
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

Mam taki problem że gdy tworze tabele z kluczem złożonym z 2 pól tworzy klucz ze "złą" kolejnością pól w kluczu na bazie.

Mam klasę np:

Kopiuj
@Table("Alarm", schema = "dbo")
class Alarm {
@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name ="AlarmId")
    private long id;
@Id
    @Column(name ="OFFICEDATETIME", columnDefinition = "datetime2(7) DEFAULT GETDATE()")
    private Timestamp officeDateTime;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "AlarmId", cascade = {CascadeType.REMOVE, CascadeType.PERSIST})
	private List<AlarmParameter> alarmParameters;
...
}


@Table("AlarmParameter", schema = "dbo")
class AlarmParameter {

@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name = "AlarmId", referencedColumnName = "AlarmId"),
            @JoinColumn(name = "AlarmOfficeTime", referencedColumnName = "OFFICEDATETIME")})
    private Alarm AlarmId;

...
}

I kolejność klucza na bazie dla tabeli Alarm jest:
[OFFICEDATETIME], [AlarmId]
a chce osiągnąć aby był:
[AlarmId], [OFFICEDATETIME]

Da się manipulować kolejnością pól klucza czy tylko tworzenie z poziomu SQL zostaje?

orchowskia
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielona Góra
  • Postów: 83
0

Kiedyś też miałem taki przypadek i rozwiązałem to dodając klasę na klucz np.

Kopiuj
@Embeddable
public class ArticleOwnerId implements Serializable {

    @Column(name = "article_id")
    private long articleId;

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

    public long getArticleId() {
        return articleId;
    }

    public String getOwnerId() {
        return ownerId;
    }
}

A później w samej encji:

Kopiuj
@Entity
@IdClass(ArticleOwnerId.class)
@Table(name = "article_owner")
public class ArticleOwner {

    @NotNull
    @Column(name = "article_id")
    private long articleId;

    @NotNull
    @Column(name = "owner_id")
    private String ownerId;
....
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

Robiłem podobnie tyle że klasa z id była @Embeddable i referencja w klasie miała @EmbededId i był ten sam problem
Dodam że baza to SQL Server

orchowskia
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielona Góra
  • Postów: 83
0

Jeszcze jak jest ten join to użyj tego typu konstrukcji

Kopiuj
           name = "article_owner",
           joinColumns = {@JoinColumn(name = "article_id")},
           inverseJoinColumns = {@JoinColumn(name = "owner_id")})```
AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
0

Adnotacja @Index nigdy mnie czymś takim nie zaskoczyła
https://docs.oracle.com/javaee/7/api/javax/persistence/Index.html

BTW NA pewno myślisz o złożonym kluczu pierwotnym??? Po Id by wystarczył, wszystko robi się prostsze.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.