Je reviens vers vous car j'ai l'erreur suivante depuis que j'ai remis les classes OrderLine et OrderLineId ainsi que les relations :
JBAS014777: Services which failed to start: service jboss.persistenceunit."jee.basics3-ear.ear/jee.basics3-ejb.jar#BookstorePU": org.jboss.msc.service.StartException in service jboss.persistenceunit."jee.basics3-ear.ear/jee.basics3-ejb.jar#BookstorePU": Failed to start service
Je pense que j'ai fais de mauvais liens entre OrderLine et Book/Order car à aucun moment je ne dis que BOOKS_ID pointe vers ID de ORDER et que ORDERS_ID pointe vers ISBN13 de BOOK. On est parti du principe que JPA créera les champs mais nos champs existes déjà car j'ai du créer la table avant donc il faudrait dire à la clé primaire ORDERS_ID de OrderLine de se lier à la clé primaire ID de ORDER et dire à la clé primaire BOOKS_ID de se lier à la clé primaire ISBN13 de BOOK.
Voici mes classes actuelles :
OrderLine :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
@Entity
@XmlRootElement
@Table(name = "ORDER_LINES")
public class OrderLine {
@EmbeddedId
private OrderLineId id;
// 05
@ManyToOne
@PrimaryKeyJoinColumn(name = "ORDERS_ID", referencedColumnName = "ordersId")
private Order order;
// 06
@OneToOne
@PrimaryKeyJoinColumn(name = "BOOKS_ID", referencedColumnName = "booksIsbn13")
private Book book;
@Column(name = "QUANTITY")
private int quantity;
private double total;
public OrderLine() {
}
public OrderLine(Book book, int quantity) {
this.book = book;
this.quantity = quantity;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public OrderLineId getId() {
return id;
}
public void setId(OrderLineId id) {
this.id = id;
}
public Order getOrders() {
return order;
}
public void setOrders(Order orders) {
this.order = orders;
}
public Book getBooks() {
return book;
}
public void setBooks(Book books) {
this.book = books;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public void addOne() {
quantity++;
}
public void removeOne() {
quantity--;
}
public void computeTotal() {
total = book.getUnitPrice() * quantity;
}
} |
OrderLineId :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
@Embeddable
public class OrderLineId implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="ORDERS_ID")
private int ordersId;
@Column(name="BOOKS_ID")
private String booksIsbn13;
public int getOrdersId() {
return ordersId;
}
public void setOrdersId(int ordersId) {
this.ordersId = ordersId;
}
public String getBooksId() {
return booksIsbn13;
}
public void setBooksId(String booksId) {
this.booksIsbn13 = booksId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((booksIsbn13 == null) ? 0 : booksIsbn13.hashCode());
result = prime * result + ordersId;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OrderLineId other = (OrderLineId) obj;
if (booksIsbn13 == null) {
if (other.booksIsbn13 != null)
return false;
} else if (!booksIsbn13.equals(other.booksIsbn13))
return false;
if (ordersId != other.ordersId)
return false;
return true;
}
} |
Order :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
@Entity
@XmlRootElement
@Table(name = "ORDERS")
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Integer id;
@Column(name = "USER_ID")
private String userId;
// 02
@ManyToOne
@JoinColumn(name = "SHIPPING_ADR_ID", referencedColumnName = "ID")
private Address shipaddress;
// 05
@OneToMany(mappedBy="order")
private List<OrderLine> orderlines;
public List<OrderLine> getOrderlines() {
return orderlines;
}
public void setOrderlines(List<OrderLine> orderlines) {
this.orderlines = orderlines;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Address getShipaddress() {
return shipaddress;
}
public void setShipaddress(Address shipaddress) {
this.shipaddress = shipaddress;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
} |
Book :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
@Entity
@XmlRootElement
@Table(name = "BOOKS")
public class Book implements Serializable {
/** Default value included to remove warning. Remove or modify at will. **/
private static final long serialVersionUID = 1L;
@Id
@NotNull
@Column(name = "ISBN13")
private String isbn;
@NotNull
@Column(name = "TITLE")
private String title;
@Column(name = "UNIT_PRICE")
private Double unitPrice;
@Column(name = "EDITOR")
private String editor;
// Ok 03
@Column(name = "AUTHOR_ID")
private Integer authorId;
@ManyToOne
private Author author;
//06
@OneToOne(mappedBy="book")
private OrderLine orderLine;
public OrderLine getOrderLine() {
return orderLine;
}
public void setOrderLine(OrderLine orderLine) {
this.orderLine = orderLine;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Double getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(Double unitPrice) {
this.unitPrice = unitPrice;
}
public String getEditor() {
return editor;
}
public void setEditor(String editor) {
this.editor = editor;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public Integer getAuthorId() {
return authorId;
}
public void setAuthorId(Integer authorId) {
this.authorId = authorId;
}
} |
Et voici comment doivent être mes tables :
1 2 3
| CREATE TABLE BOOKS (ISBN13 VARCHAR(17) NOT NULL, TITLE VARCHAR(50) NOT NULL, EDITOR VARCHAR(20), UNIT_PRICE FLOAT, AUTHOR_ID INTEGER, PRIMARY KEY (ISBN13));
CREATE TABLE ORDERS (ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, USER_ID VARCHAR(30), SHIPPING_ADR_ID INTEGER, PRIMARY KEY (ID));
CREATE TABLE ORDER_LINES (QUANTITY INTEGER NOT NULL, ORDERS_ID INTEGER NOT NULL, BOOKS_ID VARCHAR(17) NOT NULL, PRIMARY KEY (ORDERS_ID, BOOKS_ID)); |
ET également les clé secondaires (Que je n'ai pas appliqué mais ça fonctionne bien pour l'adresse et les users sans les avoirs déclaré en base):
1 2
| ALTER TABLE ORDER_LINES ADD CONSTRAINT ORDERLINESORDERSID FOREIGN KEY (ORDERS_ID) REFERENCES ORDERS (ID);
ALTER TABLE ORDER_LINES ADD CONSTRAINT ORDERLINESBOOKS_ID FOREIGN KEY (BOOKS_ID) REFERENCES BOOKS (ISBN13); |
Partager