Можно создать пользовательский ActionResult, который делает в значительной степени что-либо. ActionResult управляет тем, что передают обратно клиенту как ответ. Это было бы тривиально для создания класса, который расширяет ActionResult, который ничего не делает.
Да, вам нужна повторная рекомендация по транзакции. Обратите внимание, что в следующей конфигурации выражение pointcut выбирает конкретный bean-компонент CompanyService.
<bean id="companyService1" class="com.company.service.CompanyServiceImpl">
<property name="companyDao">
<bean class="com.company.service.CompanyDAO">
<property name="dataSource" ref="dataSource1"/>
</bean>
</property>
</bean>
<aop:config>
<aop:pointcut
id="companyServicePoint1"
expression="bean(companyService1)"/>
<aop:advisor
advice-ref="companyServiceTxAdvice1"
pointcut-ref="companyServicePoint1"/>
</aop:config>
<tx:advice id="companyServiceTxAdvice1" transaction-manager="txManager1">
<tx:attributes>
<!-- set propogation required on create methods, all others are read-only -->
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<bean
id="txManager1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1"/>
</bean>
Для настройки другого bean-компонента CompanyService необходимо продублировать тот же подробный шаблон. Другой способ разграничения транзакций в Spring использует TransactionProxyFactoryBean
. Он немного менее подробен, потому что он использует определение родительского компонента для настройки общих свойств, унаследованных дочерними компонентами.
но имеющийся у вас параметр char * name будет указывать на то же исходное значение.
childB.usage = childA.usage
Поскольку у вас есть вся структура внутри дочерней структуры, достаточно простой копии. Если бы у вас был указатель на структуру rusage внутри дочерней структуры, это могло быть проблемой. В этом случае вам пришлось бы выделить память для childB.usage, а затем выполнить memcpy, чтобы, если кто-нибудь изменит / удалит childA, childB не пострадает.
Shouldn't it be:
memcpy(&(childB.usage), &(childA.usage), sizeof(rusage))
Вы можете указать два этих параметра двумя способами, как уже упоминалось другими.
1) childB.usage = childA.usage;
2) memcpy (& childB.usage, & childA.usage, sizeof (rusage));
Первый аргумент memcpy - это место назначения, второй - источник, а третий - длина (сколько байтов вы хотите скопировать). Судя по опубликованному вами коду, вы пытались скопировать весь childB в childA, что на самом деле вам не нужно.
в этом файле я копирую элементы origin в destinazione, сначала только используя присваивания и strcpy, затем я копирую origine в memres, используя только memcpy
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct inner
{
char *parola;
int n;
} interna;
typedef struct outer
{
struct inner *ptr;
int numeroesterno;
} esterna;
struct another
{
struct inner *ptr;
int numero;
}; //never forget ; here
int main(void)
{
esterna *origine; //ptr to structs
struct another *destinazione;
struct another *memres;
char *tmpParola;
tmpParola = malloc(30*sizeof(char));
strcpy(tmpParola, "AAAAA");
interna *tmp; //remember the TYPEDEF, and don't use struct interna
tmp = (interna *)malloc(sizeof(struct inner));
// if you use struct interna in sizeof you get
// error: invalid application of ‘sizeof’ to incomplete type ‘struct interna’
tmp->n = 500;
tmp->parola = tmpParola;
origine = (esterna *)malloc(sizeof(struct outer));
origine->numeroesterno = 2;
origine->ptr = tmp; //the data structer pointed by tmp has already been allocated and set
// now I have the structure allocated and set, I want to copy this on destinazione
destinazione = (struct another *)malloc(sizeof(struct another));
destinazione->numero = origine->numeroesterno;
//destinazione->ptr = tmp; //in this case you don't copy struct inner, it's just a reference
destinazione->ptr = (interna *)malloc(sizeof(struct inner));
destinazione->ptr->parola = malloc(sizeof(char)*30);
strcpy(destinazione->ptr->parola, origine->ptr->parola);
destinazione->ptr->n = 111;
//modify origine
origine->numeroesterno = 9999;
strcpy(origine->ptr->parola, "parola modificata in origine");
//print destinazione
printf("\nparola in destinazione :%s\n", destinazione->ptr->parola);
printf("\nparola in origine :%s\n", origine->ptr->parola);
//you can see that destinazione is a copy, because mofifying origine, destinazione deosn't change
//now we play with memcpy
memres = (struct another *)malloc(sizeof(struct another));
memcpy(memres, destinazione, sizeof(destinazione)); //till here, is AAAAA
strcpy(destinazione->ptr->parola, "parola modificata in destinazione");
printf("\nmemcpy, numero %d\n", memres->numero);
printf("\nmemcpy, parola :%s\n", memres->ptr->parola);
//as you can see from the output, memcpy doesn't make a copy of destinazione:
//modifying destinazione->ptr->parola after the assignment affects what memres carries with it
//So from the idea that I got, memcpy just creates the pointers to the originary structure
free(origine->ptr->parola);
free(origine->ptr);
return 0;
}