Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / OneToMany ORA-01407 / 10 сообщений из 10, страница 1 из 1
07.03.2017, 15:53
    #39415595
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
Есть Enity

Код: java
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.
@Entity(name = "ProductForOrder")
@Table(name = "PRODUCT_FOR_ORDER")
public class ProductForOrder {
..
    private List<ProductImages> imageUrlTable;
...
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "PRODUCT_FOR_ORDER_ID", referencedColumnName = "ID")
    public List<ProductImages> getImageUrlTable() {
        return imageUrlTable;
    }
...
}

@Entity
@Table(name = "PRODUCT_IMAGES")
public class ProductImages {

    private Integer productForOrderId;
    private Integer productNSIImages;
    private Integer orderId;

    @Id
    @Column(name = "PRODUCT_FOR_ORDER_ID", nullable = false)
    public Integer getProductForOrderId() {
        return productForOrderId;
    }

    @Id
    @Column(name = "PRODUCT_NSI_IMAGES", nullable = false)
    public Integer getProductNSIImages() {
        return productNSIImages;
    }

    @Column(name = "ORDERID", nullable = false)
    public Integer getOrderId() {
        return orderId;
    }

}



Начитываю в ProductForOrder лист imageUrlTable
Потом удаляю пару штук и пробую смержиться, в результате ошибка

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Error Code: 1407
Call: UPDATE PRODUCT_IMAGES SET PRODUCT_FOR_ORDER_ID = ? WHERE ((PRODUCT_FOR_ORDER_ID = ?) AND ((PRODUCT_NSI_IMAGES = ?) AND (PRODUCT_FOR_ORDER_ID = ?)))
	bind => [null, 301, 2, 301]
	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1.handleException(EntityManagerSetupImpl.java:745)
	at org.eclipse.persistence.transaction.AbstractSynchronizationListener.handleException(AbstractSynchronizationListener.java:275)
	at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:170)
	at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
	at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:368)
	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:91)
	at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1200)
	... 121 more
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01407: невозможно заменить ("MOBILE_DEVELOP_6"."PRODUCT_IMAGES"."PRODUCT_FOR_ORDER_ID") на NULL



Как ее можно решить???
...
Рейтинг: 0 / 0
07.03.2017, 16:56
    #39415618
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
Обратный меппинг неправильный, вместо
Код: java
1.
private Integer productForOrderId;

должно быть
Код: java
1.
private ProductForOrder productForOrder;
...
Рейтинг: 0 / 0
07.03.2017, 17:59
    #39415646
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
ivanraОбратный меппинг неправильный, вместо
Код: java
1.
private Integer productForOrderId;

должно быть
Код: java
1.
private ProductForOrder productForOrder;



А надо будет еще аннотации типо @ManyToOne JoinColumn
Или хватит просто заменить?

Чтоб я просто методам тыка не делал
...
Рейтинг: 0 / 0
07.03.2017, 20:56
    #39415705
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
А что, JPA уже стал с двумя полями @Id работать?
...
Рейтинг: 0 / 0
09.03.2017, 10:13
    #39416024
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
-=Koba=-,
тут оказывается еще и составной ключ. Тяжелый случай, но решаемо. Примерно так:
Код: java
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.
@Entity
@Table(name = "PRODUCT_FOR_ORDER")
public class ProductForOrder {
	@Id
	private Integer id;
	@OneToMany(mappedBy="productForOrder")
	private List<ProductImages> imageUrlTable;
// ... и т.д.
}

@Entity
@Table(name = "PRODUCT_IMAGES")
public class ProductImages {

	@Embeddable
	public static class ProductImagesId {
		@Column(name = "PRODUCT_FOR_ORDER_ID", nullable = false)
		private Integer productForOrderId;
		@Column(name = "PRODUCT_NSI_IMAGES", nullable = false)
		private Integer productNSIImages;
		// тут еще надо реализовать equals, hashcode, getters&setters
	}

	@EmbeddedId
	private ProductImagesId id;
	@MapsId("productForOrderId")
	private ProductForOrder productForOrder;
	// и т.д.
}


Если есть доступ к базе, то желательно для PRODUCT_IMAGES сделать суррогатный ключ, тогда весь этот кошмарный меппинг не понадобится
...
Рейтинг: 0 / 0
09.03.2017, 12:31
    #39416084
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
ivanra,

У меня пошла ошибка

Код: java
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.
Error Code: 904
Call: SELECT ORDERID, PRODUCT_NSI_IMAGES1, PRODUCTFORORDER_ID FROM PRODUCT_IMAGES WHERE (PRODUCTFORORDER_ID = ?)
	bind => [301]
Query: ReadAllQuery(name="imageUrlTable" referenceClass=ProductImages sql="SELECT ORDERID, PRODUCT_NSI_IMAGES1, PRODUCTFORORDER_ID FROM PRODUCT_IMAGES WHERE (PRODUCTFORORDER_ID = ?)")
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:187)
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:277)
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:327)
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.remote.EJBRemoteTransactionPropagatingInterceptor.processInvocation(EJBRemoteTransactionPropagatingInterceptor.java:79)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:47)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:100)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.deployment.processors.StartupAwaitInterceptor.processInvocation(StartupAwaitInterceptor.java:22)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.deployment.processors.EjbSuspendInterceptor.processInvocation(EjbSuspendInterceptor.java:44)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:67)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)
	at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636)
	at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)
	at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
	at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:198)
	at org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:266)
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:184)
	at org.jboss.ejb.client.EJBObjectInterceptor.handleInvocation(EJBObjectInterceptor.java:58)
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
	at org.jboss.ejb.client.EJBHomeInterceptor.handleInvocation(EJBHomeInterceptor.java:83)
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
	at org.jboss.ejb.client.TransactionInterceptor.handleInvocation(TransactionInterceptor.java:42)
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
	at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:138)
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
	at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
	at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
	at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
	at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
	at com.sun.proxy.$Proxy112.findAllRequestProduct(Unknown Source)
	at by.softclub.abank.admin.ui.page.RequestProductListPage.loadRequestList(RequestProductListPage.java:35)
	at by.softclub.abank.admin.ui.page.RequestProductListPage.setData(RequestProductListPage.java:31)
	at by.softclub.abank.admin.ui.page.AbstractBasePage.checkAndLoad(AbstractBasePage.java:103)
	at by.softclub.abank.admin.ui.page.AbstractBasePage.prerender(AbstractBasePage.java:98)
	at by.softclub.abank.admin.ui.page.AbstractBasePage.init(AbstractBasePage.java:92)
	... 124 more
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: "PRODUCTFORORDER_ID": недопустимый идентификатор





Откуда вообще взялся PRODUCTFORORDER_ID ???
...
Рейтинг: 0 / 0
09.03.2017, 12:38
    #39416094
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
@OneToMany(mappedBy="productForOrder")
private List<ProductImages> imageUrlTable;

Вот здесь проставляется PRODUCTFORORDER_ID
Почему?
...
Рейтинг: 0 / 0
09.03.2017, 14:45
    #39416232
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
-=Koba=-,
Это я пропустил аннотацию @ManyToOne+@JoinColumn (в данном случае наименование столбца берется из определения FK). И еще до кучи: @Embeddable ключ должен быть Serializable.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
@Entity
@Table(name = "PRODUCT_IMAGES")
public class ProductImages {

	@Embeddable
	public static class ProductImagesId implements Serializable {
		//@Column(name = "PRODUCT_FOR_ORDER_ID", nullable = false)
		private Integer productForOrderId;
		@Column(name = "PRODUCT_NSI_IMAGES", nullable = false)
		private Integer productNSIImages;
		// getters,setters,equals,hashcode
	}

	@EmbeddedId
	private ProductImagesId productImagesId;
	@MapsId("productForOrderId")
	@ManyToOne
	@JoinColumn(name = "PRODUCT_FOR_ORDER_ID", referencedColumnName = "ID")
	private ProductForOrder productForOrder;
	// getters+setters
}
...
Рейтинг: 0 / 0
09.03.2017, 16:21
    #39416292
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
Спасибо за помощь
Вот еще вопрос

Создаю ProductForOrder и туда добавляю ProductImages,

В ProductImages где заполняю ProductImagesId
Оставляя ProductForOrder пустым

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: невозможно вставить NULL в ("MOBILE_DEVELOP_6"."PRODUCT_DESCRIPTION"."PRODUCT_FOR_ORDER_ID")

	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
	at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
	at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1046)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
	at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3694)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1354)
	at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:537)
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:892)
	... 163 more



Это мне надо еще и ProductForOrder в ProductImages заполнять???
...
Рейтинг: 0 / 0
09.03.2017, 17:59
    #39416396
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OneToMany ORA-01407
-=Koba=-,
видимо, да. Составные ключи всегда предполагают много писанины, а тут еще и FK в ключе.. Плюс еще надо разбираться с хозяином коллекции, предложенные аннотации - это только пример, а как оно должно быть - зависит от бизнес-кода.
Если это не легаси-база, то настоятельно советую отказаться от составного ключа, в ORM с ними тяжело
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / OneToMany ORA-01407 / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]